03C-diagonal_analysis
Competitive hierarchy (unfinished)
The competitive scores for all pairs are converted into a pairwise competitive matrix, with a value of “1” representing a win and a value of “0” representing a loss. Pairings that resulted on a draw were assingned a value of 0.5, representing coexistence.
The competitive intransitivity is determined as follow
\[\frac{\sum I{a_{ij}<a_{ji}}}{n(n-1)/2}\]
Diagonal analysis
For record, it took 1655 seconds ~= 26 minutes to compute the diagonal measures for 13 communities X 10000 randomization, merge them into one single data frame.
data/output/networks_diag
data/output/networks_diag_randomized
For a network matrix \(m_{ij}\), the fraction of coexistence as a fucntion of distance to diagonal is calculated as the
\[\frac{}{\lvert i-j \lvert}\]
networks_diag_randomized has four columns
Randomization: the number of randomization
Plot the diagonal analysis
Summary
isolates: 68 isolates
pairs: 186 pairs
communities: metadata of 13 communities
network_community.Rdata saves one R lists. net_list has 13 tbl_graph objects. that describes the competitive networks of my communities, where p_net_list has 13 pictures.
isolates <- read_csv(here::here("data/output/isolates.csv"))
Rows: 100 Columns: 62
── Column specification ────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (8): Assembly, ExpID, Community, Family, Genus, Sequence, PreferredCS, SecretedCS
dbl (52): ID, Isolate, GenusScore, ColonyCount, DilutionFactor, Epsilon, Win, Lose, Draw...
lgl (2): Fermenter, GramPositive
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pairs <- read_csv(here::here("data/output/pairs.csv"))
Rows: 248 Columns: 29
── Column specification ────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (14): Assembly, Community, InteractionType, InteractionTypeFiner, ExpID1, Family1, G...
dbl (10): Isolate1, Isolate2, From, To, ID1, GenusScore1, ID2, GenusScore2, SeqDifferenc...
lgl (5): Fermenter1, GramPositive1, Fermenter2, GramPositive2, Isolate1Dominant
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
communities <- read_csv(here::here("data/output/communities.csv"))
Rows: 17 Columns: 4
── Column specification ────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Community
dbl (3): CommunitySize, CommunityPairSize, CommunitiyMotifSize
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
load(here::here("data/output/network_community.Rdata"))
Convert the graph file into txt
So that the graph is readable in python
Error: object 'f' not found
Plot network in matrix
Upper half matrices

Plot network in graph
There are some functions to play with

Combine matrix and network plot
$C1R2
[1] NA
$C1R4
[1] NA
$C1R6
[1] NA
$C1R7
[1] NA
$C2R6
[1] NA
$C2R8
[1] NA
$C4R1
[1] NA
$C7R1
[1] NA
$C8R4
[1] NA
$C10R2
[1] NA
$C11R1
[1] NA
$C11R2
[1] NA
$C11R5
[1] NA

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb24gdGhlIGVtcGlyaWNhbCBpbnZhc2lvbiBuZXR3b3JrcyIKYXV0aG9yOiAiQ2hhbmctWXUgQ2hhbmciCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6ICAKICAgIHRvYzogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUgPSBGQUxTRSwgZWNobyA9IEZBTFNFKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGlncmFwaCkKbGlicmFyeSh0aWR5Z3JhcGgpCmxpYnJhcnkoZ2dyYXBoKQpzb3VyY2UoaGVyZTo6aGVyZSgicGxvdHRpbmdfc2NyaXB0cy9uZXR3b3JrX2Z1bmN0aW9ucy5SIikpCnJ1bl9zY3JpcHRzIDwtIEYKY29tbXVuaXRpZXMgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvY29tbXVuaXRpZXMuY3N2IikpCmBgYAoKIyBJbnRyb2R1Y3Rpb24KCi0gVGhlIFIgc2NyaXB0cyAoc291cmNlZCBpbiB0aGlzIFJtZCkgY2FuIGJlIHJ1biBleHRlcm5hbGx5IHRvIFJzdHVkaW8uCi0gVGhlIFIgc2NyaXB0cyBhcmUgb25seSBmb3Igc2F2aW5nIFIgZnVuY3Rpb25zLCBwcm9jZXNzaW5nIHJhdyBhbmQgdGVtcG9yYXJ5IGRhdGEuCi0gQWxsIHZpc3VhbGl6YXRpb24gY29kZXMgYXJlIGluIHRoaXMgUm1kIGZpbGUuCgojIDAzQS1tYWtlX25ldHdvcmsKCi0gTWFrZSBjb21tdW5pdHkgbmV0d29yayBmcm9tIGBkYXRhL291dHB1dC9wYWlycy5jc3ZgLgoKLSBQbG90IG5ldHdvcmtzIGFuZCBtYXRyaWNlcwoKIyMgTWFrZSBuZXR3b3JrCgpgYGB7cn0KaWYgKHJ1bl9zY3JpcHRzKSBzb3VyY2UoInNjcmlwdC8wM0EtbWFrZV9uZXR3b3JrLTAxLW1ha2VfcGFpcndpc2VfbmV0d29yay5SIikKYGBgCgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTh9CnBfbmV0X2xpc3QgPC0gbGFwcGx5KG5ldF9saXN0LCBGVU4gPSBwbG90X2NvbXBldGl0aXZlX25ldHdvcmspCnBsb3RfZ3JpZChwbG90bGlzdCA9IHBfbmV0X2xpc3QsIG5jb2wgPSA0KQpgYGAKCgoKIyMgUGFpcndpc2UgbWF0cmljZQoKYGBge3J9CmlmIChydW5fc2NyaXB0cykgc291cmNlKCJzY3JpcHQvMDNBLW1ha2VfbmV0d29yay0wMi1wYWlyd2lzZV9tYXRyaXguUiIpCmBgYAoKClBsb3QgdGhlIGNvbW11bml0aWVzJyBwYWlyd2lzZSBtYXRyaXgsIHdob3NlIGF4aXMgYXJlIG9yZGVyZWQgYnkgY29tcGV0aXRpdmUgcmFua3MKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0zfQpwIDwtIHBsb3RfZ3JpZChwbG90bGlzdCA9IHBfbmV0X21hdHJpeF9wbG90X2xpc3QsIG5yb3cgPSAyKQpwCmdnc2F2ZSgiZmlndXJlLzAzQS1hZGphY2VudF9tYXRyaXgucG5nIiwgcGxvdCA9IHAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDMpCmBgYAoKCiMjIFJhbmRvbWl6ZSBuZXR3b3JrcwoKYGBge3J9CmlmIChydW5fc2NyaXB0cykgc291cmNlKCJzY3JpcHQvMDNBLW1ha2VfbmV0d29yay0wMy1yYW5kb21pemVfbmV0d29yay5SIikKYGBgCgpGb3IgcmVjb3JkLCBpdCB0b29rIDI2MDMgc2Vjb25kcyB+PSA0MCBtaW5zIHRvIGdlbmVyYXRlIDEwMDAwIHJhbmRvbWl6ZWQgbmV0d29ya3MgZm9yIGFsbCAxMyBjb21tdW5pdGllcy4gCgpJdCB0b29rIH41MCBzZWNvbmRzIHRvIHJhbmRvbWl6ZSAxMDAwIHRpbWVzIGZvciBlYWNoIG9mIHRoZSBjb21tdW5pdGllcy4gU28gdG90YWwgb2YgNjQxIHNlY29uZHMgbmVlZGVkLgoKVGhlIHJhbmRvbWl6ZWQgbmV0d29ya3MgYXJlIHNhdmVkIGluIGBkYXRhL291dHB1dC9uZXR3b3JrX3JhbmRvbWl6ZWQuUmRhdGFgIHdoaWNoIGNvbnRhaW5zIGEgdHdvLWxheWVyIFIgbGlzdCBgbmV0X3JhbmRvbWl6ZWRfbGlzdGAgaW4gd2hpY2ggdGhlIGZpcnN0IGxheWVyIGhhcyB0aGUgMTMgY29tbXVuaXRpZXMgYW5kIHRoZSBzZWNvbmQgbGF5ZXIgaGFzIDEwMDAgcmFuZG9taXplZCBuZXR3b3Jrcy4KCkV4YW1wbGUgb2YgcmFuZG9taXplZCBuZXR3b3JrIG1hdHJpeApgYGB7ciBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gM30KbG9hZChoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9uZXR3b3JrX3JhbmRvbWl6ZWQuUmRhdGEiKSkKbmV0X3JhbmRvbWl6ZWRfbGlzdCRDMTFSMltbMV1dICU+JSBwbG90X2FkamFjZW50X21hdHJpeCgpCmBgYAoKCiMgMDNCLW5ldHdvcmtfbW90aWZzCgpgYGB7cn0KIyBEYXRhCmlzb2xhdGVzIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvb3V0cHV0L2lzb2xhdGVzLmNzdiIpKQpwYWlycyA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9wYWlycy5jc3YiKSkKY29tbXVuaXRpZXMgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvY29tbXVuaXRpZXMuY3N2IikpCmNvbW11bml0aWVzX25hbWUgPC0gY29tbXVuaXRpZXMkQ29tbXVuaXR5CmNvbW11bml0aWVzX3NpemUgPC0gY29tbXVuaXRpZXMkQ29tbXVuaXR5U2l6ZQpjb21tdW5pdGllc19uYW1lX3Bvb2wgPC0gYyhwYXN0ZTAoIkMiLCAxOjEyLCAiUnBvb2wiKSwgcGFzdGUwKCJDIiwgcmVwKDE6MTIsIGVhY2ggPSA4KSwgIlIiLCByZXAoMTo4LCAxMikpKQpmYW1pbGllc19uYW1lIDwtIGMoIkFlcm9tb25hZGFjZWFlIiwgIkFsY2FsaWdlbmFjZWFlIiwgIkJyYWR5cmhpem9iaWFjZWFlIiwgIkJydWNlbGxhY2VhZSIsICJCdXJraG9sZGVyaWFjZWFlIiwgIkNhdWxvYmFjdGVyYWNlYWUiLCAiQ2VsbHVsb21vbmFkYWNlYWUiLCAiQ2hpdGlub3BoYWdhY2VhZSIsICJDaHRob25pb2JhY3RlcmFjZWFlIiwgIkNvbWFtb25hZGFjZWFlIiwgIkNyeW9tb3JwaGFjZWFlIiwgIkVudGVyb2JhY3RlcmlhY2VhZSIsICJFbnRlcm9jb2NjYWNlYWUiLCAiRmxhdm9iYWN0ZXJpYWNlYWUiLCAiSHlwaG9taWNyb2JpYWNlYWUiLCAiTGlzdGVyaWFjZWFlIiwgIk1pY3JvYmFjdGVyaWFjZWFlIiwgIk1vcmF4ZWxsYWNlYWUiLCAiTm9jYXJkaWFjZWFlIiwgIk9ic2N1cmliYWN0ZXJhbGVzLjE3IiwgIk94YWxvYmFjdGVyYWNlYWUiLCAiUGFlbmliYWNpbGxhY2VhZSIsICJQaHlsbG9iYWN0ZXJpYWNlYWUiLCAiUG9ycGh5cm9tb25hZGFjZWFlIiwgIlBzZXVkb21vbmFkYWNlYWUiLCAiUmhpem9iaWFjZWFlIiwgIlNhbmd1aWJhY3RlcmFjZWFlIiwgIlNwaGluZ29iYWN0ZXJpYWNlYWUiLCAiU3BoaW5nb21vbmFkYWNlYWUiLCAiWGFudGhvbW9uYWRhY2VhZSIpCgpgYGAKCgojIyBEZXRlY3QgbW90aWZzIGluIG5ldHdvcmtzCgoKYGBge3IgZXZhbCA9IEZ9CiMgVGhpcyBtYXkgdGFrZSB+NSBtaW51dGVzIGZvciAxMDAwMCBib290c3RyYXBwaW5nCmlmIChydW5fc2NyaXB0cykgc291cmNlKCJzY3JpcHQvMDNCLWludmFzaW9uX25ldHdvcmstMDEtZGV0ZWN0X21vdGlmLlIiKQpgYGAKCi0gYG5ldHdvcmtzX21vdGlmYDogZGF0YS5mcmFtZQotIGBuZXR3b3Jrc19tb3RpZl9yYW5kb21pemVkYDogZGF0YS5mcmFtZSBmb3IgYWxsIHJhbmRvbWl6ZWQgbmV0d29ya3MgbW90aWYgY291bnRzCgpFbXBpcmljYWwgbmV0d29yayBtb3RpZnMuIDEzIGNvbW11bml0aWVzIHggNyBtb3RpZnMgPSA5MSByb3dzCgpgYGB7cn0KbmV0d29ya3NfbW90aWYgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvbmV0d29ya3NfbW90aWYuY3N2IikpCm5ldHdvcmtzX21vdGlmCmBgYAoKU2h1ZmZsZWQgbmV0d29yayBtb3RpZnMuIDEzIGNvbW11bml0aWVzIHggNyBtb3RpZnMgeCAxMDAwIGJvb3RzdHJhcHMgPSA5MTAwMCByb3dzCgpgYGB7cn0KbmV0d29ya3NfbW90aWZfcmFuZG9taXplZCA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9uZXR3b3Jrc19tb3RpZl9yYW5kb21pemVkLmNzdiIpKQpuZXR3b3Jrc19tb3RpZl9yYW5kb21pemVkCmBgYAoKCgojIyBNb3RpZiBkaXN0cmlidXRpb25zCgpgYGB7cn0KaWYgKHJ1bl9zY3JpcHRzKSBzb3VyY2UoInNjcmlwdC8wM0ItaW52YXNpb25fbmV0d29yay0wMi1wbG90X21vdGlmLlIiKQpgYGAKCgpgYGB7ciBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gMS41fQpsb2FkKGhlcmU6OmhlcmUoImRhdGEvb3V0cHV0L21vdGlmX2xpc3QuUmRhdGEiKSkKcF9tb3RpZl9leGFtcGxlIDwtIHBsb3RfZ3JpZChwbG90bGlzdCA9IGxhcHBseShtb3RpZl9saXN0LCBmdW5jdGlvbih4KSBwbG90X2NvbXBldGl0aXZlX25ldHdvcmsoeCwgbm9kZV9zaXplPTMpKSwgbnJvdyA9IDEpCnBfbW90aWZfZXhhbXBsZQpnZ3NhdmUoImZpZ3VyZS8wM0ItZXhhbXBsZV9tb3RpZnMucG5nIiwgcF9tb3RpZl9leGFtcGxlLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxLjUpCmBgYAoKCkRldGVjdCBtb3RpZnMgaW4gcmFuZG9taXplZCBuZXR3b3JrcwoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NX0KIyBQbG90IG9ic2VydmF0aW9ucyBhbmQgNSUgYW5kIDk1JSBwZXJjZW50aWxlcyAtLS0tCnBfbW90aWZfcmFuZG9taXplZCA8LQogIGdncGxvdCgpICsKICAjIDUlIGFuZCA5NSUgcGVyY2VudGlsZXMgaW4gcmFuZG9taXplZCBuZXR3b3JrcwogIGdlb21fcG9pbnQoZGF0YSA9IG5ldHdvcmtzX21vdGlmX3JhbmRvbWl6ZWRfcGVyY2VudGlsZSwgYWVzKHggPSBNb3RpZiwgeSA9IENvdW50TW90aWYsIGdyb3VwID0gTW90aWYpLCBjb2wgPSAiYmxhY2siKSArCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBzcHJlYWQobmV0d29ya3NfbW90aWZfcmFuZG9taXplZF9wZXJjZW50aWxlLCBQZXJjZW50aWxlLCBDb3VudE1vdGlmKSwKICAgICAgICAgICAgICAgYWVzKHggPSBNb3RpZiwgeGVuZCA9IE1vdGlmLCB5ID0gcDUsIHllbmQgPSBwOTUpLCBjb2wgPSAiYmxhY2siKSArCiAgIyBPYnNlcnZhdGlvbnMKICBnZW9tX3BvaW50KGRhdGEgPSBuZXR3b3Jrc19tb3RpZiwgYWVzKHggPSBNb3RpZiwgeSA9IENvdW50TW90aWYpLCBjb2wgPSAicmVkIikgKwogICMgIHNjYWxlX2NvbG91cl9tYW51YWwobmFtZT0iRXJyb3IgQmFycyIsdmFsdWVzPWMoImJsYWNrIiwgInJlZCIpKSArCiAgZmFjZXRfd3JhcChDb21tdW5pdHkgfi4sIHNjYWxlID0gImZyZWVfeSIpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJNb3RpZiBjb3VudHMgaW4gdGhlIGludmFzaW9uIG5ldHdvcmtzIikgKwogIGxhYnMoeCA9ICJtb3RpZiIsIHkgPSAiQ291bnQiKQoKcF9tb3RpZl9yYW5kb21pemVkCmdnc2F2ZSgiZmlndXJlLzAzQi1tb3RpZl9yYW5kb21pemVkLnBuZyIsIHBfbW90aWZfcmFuZG9taXplZCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTApCmBgYAoKUGxvdCB0aGUgaGlzdG9ncmFtIG9mIHJhbmRvbWl6ZWQgbmV0d29yayBtb3RpZnMgCgpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDE1fQojIFBsb3QgaGlzdG9ncmFtIGluIG1vdGlmIGNvdW50IGRpc3RyaWJ1dGlvbiAtLS0tCnBfbW90aWZfcmFuZG9taXplZF9oaXN0byA8LQogIG5ldHdvcmtzX21vdGlmX3JhbmRvbWl6ZWQgJT4lCiMgIGZpbHRlcihDb21tdW5pdHkgPT0gIkMxMVIxIikgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyhDb3VudE1vdGlmKSwgZmlsbCA9IE5BLCBjb2wgPSAxKSArCiAgZ2VvbV92bGluZShkYXRhID0gbmV0d29ya3NfbW90aWYsIGFlcyh4aW50ZXJjZXB0ID0gQ291bnRNb3RpZiksIGNvbCA9ICJyZWQiKSArCiAgZmFjZXRfZ3JpZChDb21tdW5pdHkgfiBNb3RpZiwgc2NhbGUgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgbGFicyh4ID0gIm1vdGlmIGNvdW50cyIsIHkgPSAiY291bnRzIGluIHJhbmRvbWl6YXRpb24iKQpwX21vdGlmX3JhbmRvbWl6ZWRfaGlzdG8KZ2dzYXZlKCJmaWd1cmUvMDNCLW1vdGlmX2hpc3RvZ3JhbS5wbmciLCBwX21vdGlmX3JhbmRvbWl6ZWRfaGlzdG8sIHdpZHRoID0gMjAsIGhlaWdodCA9IDMwKTsgCmBgYAoKCgoKIyAwM0MtZGlhZ29uYWxfYW5hbHlzaXMKCiMjIENvbXBldGl0aXZlIGhpZXJhcmNoeSAodW5maW5pc2hlZCkKCmBgYHtyfQppZiAocnVuX3NjcmlwdHMpIHNvdXJjZSgic2NyaXB0LzAzQy1kaWFnbm9uYWxfYW5hbHlzaXMtMDEtY29tcGV0aXRpdmVfaGllcmFyY2h5LlIiKQpgYGAKClRoZSBjb21wZXRpdGl2ZSBzY29yZXMgZm9yIGFsbCBwYWlycyBhcmUgY29udmVydGVkIGludG8gYSBwYWlyd2lzZSBjb21wZXRpdGl2ZSBtYXRyaXgsIHdpdGggYSB2YWx1ZSBvZiAiMSIgcmVwcmVzZW50aW5nIGEgd2luIGFuZCBhIHZhbHVlIG9mICIwIiByZXByZXNlbnRpbmcgYSBsb3NzLiBQYWlyaW5ncyB0aGF0IHJlc3VsdGVkIG9uIGEgZHJhdyB3ZXJlIGFzc2luZ25lZCBhIHZhbHVlIG9mIDAuNSwgcmVwcmVzZW50aW5nIGNvZXhpc3RlbmNlLgoKVGhlIGNvbXBldGl0aXZlIGludHJhbnNpdGl2aXR5IGlzIGRldGVybWluZWQgYXMgZm9sbG93CgokJFxmcmFje1xzdW0gSXthX3tpan08YV97aml9fX17bihuLTEpLzJ9JCQKCiMjIERpYWdvbmFsIGFuYWx5c2lzCgpgYGB7cn0KIyBJdCB0YWtlcyAyNiBtaW51dGVzIHRvIHJ1biB0aGlzIHNjcmlwdCBmb3IgMTAwMDAgYm9vdHN0cmFwcwppZiAocnVuX3NjcmlwdHMpIHNvdXJjZSgic2NyaXB0LzAzQy1kaWFnbm9uYWxfYW5hbHlzaXMtMDItZGlzdGFuY2VfdG9fZGlhZ29uYWwuUiIpCmBgYAoKRm9yIHJlY29yZCwgaXQgdG9vayAxNjU1IHNlY29uZHMgfj0gMjYgbWludXRlcyB0byBjb21wdXRlIHRoZSBkaWFnb25hbCBtZWFzdXJlcyBmb3IgMTMgY29tbXVuaXRpZXMgWCAxMDAwMCByYW5kb21pemF0aW9uLCBtZXJnZSB0aGVtIGludG8gb25lIHNpbmdsZSBkYXRhIGZyYW1lLgoKYGRhdGEvb3V0cHV0L25ldHdvcmtzX2RpYWdgCgpgZGF0YS9vdXRwdXQvbmV0d29ya3NfZGlhZ19yYW5kb21pemVkYAoKRm9yIGEgbmV0d29yayBtYXRyaXggJG1fe2lqfSQsIHRoZSBmcmFjdGlvbiBvZiBjb2V4aXN0ZW5jZSBhcyBhIGZ1Y250aW9uIG9mIGRpc3RhbmNlIHRvIGRpYWdvbmFsIGlzIGNhbGN1bGF0ZWQgYXMgdGhlCgokJFxmcmFje317XGx2ZXJ0IGktaiBcbHZlcnR9JCQKIApgbmV0d29ya3NfZGlhZ19yYW5kb21pemVkYCBoYXMgZm91ciBjb2x1bW5zCgpgUmFuZG9taXphdGlvbmA6IHRoZSBudW1iZXIgb2YgcmFuZG9taXphdGlvbiAKCmBgYHtyfQpuZXR3b3Jrc19kaWFnIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvb3V0cHV0L25ldHdvcmtzX2RpYWcuY3N2IikpCm5ldHdvcmtzX2RpYWdfcmFuZG9taXplZApgYGAKCmBgYHtyfQpuZXR3b3Jrc19kaWFnX3JhbmRvbWl6ZWQgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvbmV0d29ya3NfZGlhZ19yYW5kb21pemVkLmNzdiIpKQpuZXR3b3Jrc19kaWFnX3JhbmRvbWl6ZWQKYGBgCgoKCiMjIFBsb3QgdGhlIGRpYWdvbmFsIGFuYWx5c2lzCgpgYGB7cn0KaWYgKHJ1bl9zY3JpcHRzKSBzb3VyY2UoInNjcmlwdC8wM0MtZGlhZ25vbmFsX2FuYWx5c2lzLTAzLXBsb3RfZGlhZ29uYWxfYW5hbHlzaXMuUiIpCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSA1fQojIFIgZnVuY3Rpb24gZm9yIHBsb3R0aW5nIGJveHBsb3QKcGxvdF9ib3hwbG90IDwtIGZ1bmN0aW9uKG5ldHdvcmtzX2RpYWcsIG5ldHdvcmtzX2RpYWdfcmFuZG9taXplZCwgZmFjZXRfYnlfY29tbXVuaXR5ID0gVFJVRSkgewogIGdncGxvdCgpICsKICAgICMgUmFuZG9tIG5ldHdvcmtzCiAgICBnZW9tX2JveHBsb3QoZGF0YSA9IG5ldHdvcmtzX2RpYWdfcmFuZG9taXplZCwgYWVzKHggPSBEaXN0YW5jZVRvRGlhZ29uYWwsIHkgPSBDb3VudENvZXhpc3RlbmNlLCBncm91cCA9IERpc3RhbmNlVG9EaWFnb25hbCkpICsKICAgICMgT2JzZXJ2ZWQgbmV0d29ya3MKICAgIGdlb21fcG9pbnQoZGF0YSA9IG5ldHdvcmtzX2RpYWcsIGFlcyh4ID0gRGlzdGFuY2VUb0RpYWdvbmFsLCB5ID0gQ291bnRDb2V4aXN0ZW5jZSwgZ3JvdXAgPSBEaXN0YW5jZVRvRGlhZ29uYWwpLCBjb2wgPSAicmVkIiwgc2l6ZSA9IDIpICsKICAgIGdlb21fbGluZShkYXRhID0gbmV0d29ya3NfZGlhZywgYWVzKHggPSBEaXN0YW5jZVRvRGlhZ29uYWwsIHkgPSBDb3VudENvZXhpc3RlbmNlKSwgY29sID0gInJlZCIpICsKICAgIHtpZiAoZmFjZXRfYnlfY29tbXVuaXR5KSBmYWNldF93cmFwKENvbW11bml0eX4uLCBzY2FsZSA9ICJmcmVlIikgfSArCiAgICAjIEFzZXRoZXRpYyBzZXR1cAogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHggPSAiZGlzdGFuY2UgdG8gZGlhZ2lvbmFsICh8aS1qfCkiLCB5ID0gImNvdW50IG9mIGNvZXhpc3RlbmNlIikKfQoKbmV0d29ya3NfZGlhZyA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9uZXR3b3Jrc19kaWFnLmNzdiIpKSAlPiUgbXV0YXRlKENvbW11bml0eSA9IG9yZGVyZWQoQ29tbXVuaXR5LCBjb21tdW5pdGllcyRDb21tdW5pdHkpKQpuZXR3b3Jrc19kaWFnX3JhbmRvbWl6ZWQgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvbmV0d29ya3NfZGlhZ19yYW5kb21pemVkLmNzdiIpKSAlPiUgbXV0YXRlKENvbW11bml0eSA9IG9yZGVyZWQoQ29tbXVuaXR5LCBjb21tdW5pdGllcyRDb21tdW5pdHkpKQoKIyBJbmRpdmlkdWFsIGNvbW11bml0eQpwX25ldHdvcmtzX2RpYWcgPC0gcGxvdF9ib3hwbG90KG5ldHdvcmtzX2RpYWcsIG5ldHdvcmtzX2RpYWdfcmFuZG9taXplZCwgZmFjZXRfYnlfY29tbXVuaXR5ID0gVCkgKwogIGdndGl0bGUoIjEzIGNvbW11bml0aWVzIikKCiMgTmV0d29yayBwb29sCiMjIFBvb2wgYWxsIGNvbW11bml0aWVzCm5ldHdvcmtzX2RpYWdfcG9vbCA8LSBuZXR3b3Jrc19kaWFnICU+JSBncm91cF9ieShEaXN0YW5jZVRvRGlhZ29uYWwpICU+JSBzdW1tYXJpemUoQ291bnRDb2V4aXN0ZW5jZSA9IHN1bShDb3VudENvZXhpc3RlbmNlKSkKbmV0d29ya3NfZGlhZ19yYW5kb21pemVkX3Bvb2wgPC0gbmV0d29ya3NfZGlhZ19yYW5kb21pemVkICU+JSBncm91cF9ieShSYW5kb21pemF0aW9uLCBEaXN0YW5jZVRvRGlhZ29uYWwpICU+JSBzdW1tYXJpemUoQ291bnRDb2V4aXN0ZW5jZSA9IHN1bShDb3VudENvZXhpc3RlbmNlKSkKcF9uZXR3b3Jrc19kaWFnX3Bvb2wxIDwtIHBsb3RfYm94cGxvdChuZXR3b3Jrc19kaWFnX3Bvb2wsIG5ldHdvcmtzX2RpYWdfcmFuZG9taXplZF9wb29sLCBmYWNldF9ieV9jb21tdW5pdHkgPSBGKSArCiAgZ2d0aXRsZSgiMTMgY29tbXVuaXRpZXMgcG9vbGVkIHRvZ2V0aGVyIikKCiMjIFBvb2wgc21hbGwgY29tbXVuaXRpZXMKbmV0d29ya3NfZGlhZ19wb29sIDwtIG5ldHdvcmtzX2RpYWcgJT4lIGZpbHRlcighQ29tbXVuaXR5ICVpbiUgYygiQzExUjEiLCAiQzExUjIiKSkgJT4lIGdyb3VwX2J5KERpc3RhbmNlVG9EaWFnb25hbCkgJT4lIHN1bW1hcml6ZShDb3VudENvZXhpc3RlbmNlID0gc3VtKENvdW50Q29leGlzdGVuY2UpKQpuZXR3b3Jrc19kaWFnX3JhbmRvbWl6ZWRfcG9vbCA8LSBuZXR3b3Jrc19kaWFnX3JhbmRvbWl6ZWQgJT4lIGZpbHRlcighQ29tbXVuaXR5ICVpbiUgYygiQzExUjEiLCAiQzExUjIiKSkgJT4lIGdyb3VwX2J5KFJhbmRvbWl6YXRpb24sIERpc3RhbmNlVG9EaWFnb25hbCkgJT4lIHN1bW1hcml6ZShDb3VudENvZXhpc3RlbmNlID0gc3VtKENvdW50Q29leGlzdGVuY2UpKQpwX25ldHdvcmtzX2RpYWdfcG9vbDIgPC0gcGxvdF9ib3hwbG90KG5ldHdvcmtzX2RpYWdfcG9vbCwgbmV0d29ya3NfZGlhZ19yYW5kb21pemVkX3Bvb2wsIGZhY2V0X2J5X2NvbW11bml0eSA9IEYpICsKICBnZ3RpdGxlKCIxMSBzbWFsbCBjb21tdW5pdGllcyBwb29sZWQgdG9nZXRoZXIiKQoKIyMgUG9vbCBzbWFsbCBjb21tdW5pdGllcwpuZXR3b3Jrc19kaWFnX3Bvb2wgPC0gbmV0d29ya3NfZGlhZyAlPiUgZmlsdGVyKCFDb21tdW5pdHkgJWluJSBjKCJDMVI3IiwgIkMxMVIxIiwgIkMxMVIyIikpICU+JSBncm91cF9ieShEaXN0YW5jZVRvRGlhZ29uYWwpICU+JSBzdW1tYXJpemUoQ291bnRDb2V4aXN0ZW5jZSA9IHN1bShDb3VudENvZXhpc3RlbmNlKSkKbmV0d29ya3NfZGlhZ19yYW5kb21pemVkX3Bvb2wgPC0gbmV0d29ya3NfZGlhZ19yYW5kb21pemVkICU+JSBmaWx0ZXIoIUNvbW11bml0eSAlaW4lIGMoIkMxUjciLCAiQzExUjEiLCAiQzExUjIiKSkgJT4lIGdyb3VwX2J5KFJhbmRvbWl6YXRpb24sIERpc3RhbmNlVG9EaWFnb25hbCkgJT4lIHN1bW1hcml6ZShDb3VudENvZXhpc3RlbmNlID0gc3VtKENvdW50Q29leGlzdGVuY2UpKQpwX25ldHdvcmtzX2RpYWdfcG9vbDMgPC0gcGxvdF9ib3hwbG90KG5ldHdvcmtzX2RpYWdfcG9vbCwgbmV0d29ya3NfZGlhZ19yYW5kb21pemVkX3Bvb2wsIGZhY2V0X2J5X2NvbW11bml0eSA9IEYpICsKICBnZ3RpdGxlKCIxMCBzbWFsbCBjb21tdW5pdGllcyBwb29sZWQgdG9nZXRoZXIiKQoKCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSA1fQpwX25ldHdvcmtzX2RpYWcKZ2dzYXZlKCJmaWd1cmUvMDNDLW5ldHdvcmtzX2RpYWdvbmFsLnBuZyIsIHBfbmV0d29ya3NfZGlhZywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTApCmBgYAoKCgpgYGB7ciBmaWcud2lkdGggPSA5LCBmaWcuaGVpZ2h0ID0gM30KcF9uZXR3b3Jrc19kaWFnX3Bvb2wgPC0gcGxvdF9ncmlkKHBfbmV0d29ya3NfZGlhZ19wb29sMSwgcF9uZXR3b3Jrc19kaWFnX3Bvb2wyLCBwX25ldHdvcmtzX2RpYWdfcG9vbDMsIG5jb2wgPSAzLCBhbGlnbiA9ICJoIikKcF9uZXR3b3Jrc19kaWFnX3Bvb2wKZ2dzYXZlKCJmaWd1cmUvMDNDLW5ldHdvcmtzX2RpYWdvbmFsX3Bvb2wucG5nIiwgcF9uZXR3b3Jrc19kaWFnX3Bvb2wsIHdpZHRoID0gMTAsIGhlaWdodCA9IDMpCgpgYGAKCgoKCiMgU3VtbWFyeQoKCi0gYGlzb2xhdGVzYDogNjggaXNvbGF0ZXMKLSBgcGFpcnNgOiAxODYgcGFpcnMKLSBgY29tbXVuaXRpZXNgOiBtZXRhZGF0YSBvZiAxMyBjb21tdW5pdGllcwotIGBuZXR3b3JrX2NvbW11bml0eS5SZGF0YWAgc2F2ZXMgb25lIFIgbGlzdHMuIGBuZXRfbGlzdGAgIGhhcyAxMyBgdGJsX2dyYXBoYCBvYmplY3RzLiB0aGF0IGRlc2NyaWJlcyB0aGUgY29tcGV0aXRpdmUgbmV0d29ya3Mgb2YgbXkgY29tbXVuaXRpZXMsIHdoZXJlIGBwX25ldF9saXN0YCBoYXMgMTMgcGljdHVyZXMuCgpgYGB7ciBlY2hvID0gVH0KaXNvbGF0ZXMgPC0gcmVhZF9jc3YoaGVyZTo6aGVyZSgiZGF0YS9vdXRwdXQvaXNvbGF0ZXMuY3N2IikpCnBhaXJzIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvb3V0cHV0L3BhaXJzLmNzdiIpKQpjb21tdW5pdGllcyA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9jb21tdW5pdGllcy5jc3YiKSkKbG9hZChoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9uZXR3b3JrX2NvbW11bml0eS5SZGF0YSIpKQpgYGAKCgojIyBDb252ZXJ0IHRoZSBncmFwaCBmaWxlIGludG8gdHh0IAoKU28gdGhhdCB0aGUgZ3JhcGggaXMgcmVhZGFibGUgaW4gcHl0aG9uCgpgYGB7cn0KbG9hZChoZXJlOjpoZXJlKCJkYXRhL291dHB1dC9uZXR3b3JrX2NvbW11bml0eS5SZGF0YSIpKQpsb2FkKGhlcmU6OmhlcmUoImRhdGEvb3V0cHV0L21vdGlmX2xpc3QuUmRhdGEiKSkKCiMgT25seSB1c2UgdGhvc2UgdGhhdCBhcmUgCmxpYnJhcnkoaWdyYXBoKQpmb3IgKGkgaW4gMTpsZW5ndGgobmV0X2xpc3QpKSB7CiAgICB3cml0ZV9ncmFwaChuZXRfbGlzdFtbaV1dLCBoZXJlOjpoZXJlKHBhc3RlMCgiZGF0YS90ZW1wL25ldHdvcmtzLyIsIG5hbWVzKG5ldF9saXN0KVtpXSwgIi50eHQiKSkpCn0KZm9yIChpIGluIDE6bGVuZ3RoKG1vdGlmX2xpc3QpKSB7CiAgICB3cml0ZV9ncmFwaChtb3RpZl9saXN0W1tpXV0sIGhlcmU6OmhlcmUocGFzdGUwKCJkYXRhL3RlbXAvbmV0d29ya3MvbW90aWYiLCBpLCAiLnR4dCIpKSkKfQoKCndyaXRlX2dyYXBoKG5ldF9saXN0W1tpXV0sIGhlcmU6OmhlcmUocGFzdGUwKCJkYXRhL3RlbXAvbmV0d29ya3MvIiwgbmFtZXMobmV0X2xpc3QpW2ldLCAiLnR4dCIpKSkKd3JpdGVfZ3JhcGgobW90aWZfbGlzdFtbaV1dLCBoZXJlOjpoZXJlKHBhc3RlMCgiZGF0YS90ZW1wL25ldHdvcmtzLyIsIG5hbWVzKG5ldF9saXN0KVtpXSwgIi50eHQiKSkpCgpgYGAKCgoKIyMgUGxvdCBuZXR3b3JrIGluIG1hdHJpeAoKVXBwZXIgaGFsZiBtYXRyaWNlcwoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9OH0KcF9uZXRfbWF0cml4X2xpc3QgPC0gbGFwcGx5KG5ldF9saXN0LCBmdW5jdGlvbih4KSBwbG90X2FkamFjZW50X21hdHJpeCh4KSkgJT4lIHNldE5hbWVzKGNvbW11bml0aWVzJENvbW11bml0eSkKcF9uZXRfbWF0cml4X2xpc3QgPC0gcF9uZXRfbWF0cml4X2xpc3Rbb3JkZXIoY29tbXVuaXRpZXMkQ29tbXVuaXR5U2l6ZSwgZGVjcmVhc2luZyA9IFQpXQpwbG90X2dyaWQocGxvdGxpc3QgPSBwX25ldF9tYXRyaXhfbGlzdCwgbGFiZWxzID0gTEVUVEVSU1syOjE0XSwgbmNvbCA9IDMsIGhqdXN0ID0gMSkKYGBgCgojIyBQbG90IG5ldHdvcmsgaW4gZ3JhcGgKClRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB0byBwbGF5IHdpdGggCmBgYHtyLCBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD04fQpwX25ldF9saXN0IDwtIHBfbmV0X2xpc3Rbb3JkZXIoY29tbXVuaXRpZXMkQ29tbXVuaXR5U2l6ZSxkZWNyZWFzaW5nID0gVCldCnBsb3RfZ3JpZChwbG90bGlzdCA9IHBfbmV0X2xpc3QsIGxhYmVscyA9IExFVFRFUlNbMjoxNF0sIG5jb2wgPSAzLCBoanVzdCA9IC0xKQpgYGAKCiMjIENvbWJpbmUgbWF0cml4IGFuZCBuZXR3b3JrIHBsb3QKCmBgYHtyfQpwX2xpc3QgPC0gcmVwKGxpc3QoTkEpLCBsZW5ndGgobmV0X2xpc3QpKQpuYW1lcyhwX2xpc3QpIDwtIGNvbW11bml0aWVzJENvbW11bml0eQoKZm9yIChpIGluIDE6bGVuZ3RoKG5ldF9saXN0KSkgewogIHBfbGlzdFtbaV1dIDwtIGdnZHJhdyhwX25ldF9tYXRyaXhfbGlzdFtbaV1dKSArCiAgICBkcmF3X3Bsb3QocGxvdCA9IHBfbmV0X2xpc3RbW2ldXSwgeCA9IDAsIHkgPSAwLCB3aWR0aCA9IDAuNDUsIGhlaWdodCA9IDAuNSkKfQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTE2fQpwIDwtIHBsb3RfZ3JpZChwbG90bGlzdCA9IHBfbGlzdCwgbmNvbCA9IDMsIGhqdXN0ID0gLTEsIHZqdXN0ID0gMSkKZ2dzYXZlKCJmaWd1cmUvMDMtbmV0d29ya3MucG5nIiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMzIpCnAKYGBgCgoKCg==